#include "PubDefine.h"
#include "hexsprint.h"
#if defined(WIN32)
#else
	#include "libext.h"
#endif

void
hex_and_ascii_print_with_offset(register const char *ident,
	register const u_char *cp, register u_int length, register u_int oset,char *lbl,char* hex,char* asc)
{
	register u_int i;
	register int s1, s2;
	register int nshorts;
	char hexstuff[HEXDUMP_SHORTS_PER_LINE*HEXDUMP_HEXSTUFF_PER_SHORT+1], *hsp;
	char asciistuff[ASCII_LINELENGTH+1], *asp;
	char _asc[255]="\0";
	char _lbl[255]="\0";
	char _hex[255]="\0";
	nshorts = length / sizeof(u_short);
	i = 0;
	hsp = hexstuff; asp = asciistuff;
	while (--nshorts >= 0) {
		s1 = *cp++;
		s2 = *cp++;
		(void)sprintf(hsp,
			"%02x %02x ", s1, s2);
		strupr(hsp);
		hsp += HEXDUMP_HEXSTUFF_PER_SHORT;
		*(asp++) = (isgraph(s1) ? s1 : '.');
		*(asp++) = (isgraph(s2) ? s2 : '.');
		i++;
		if (i >= HEXDUMP_SHORTS_PER_LINE) {
			*hsp = *asp = '\0';
			//(void)sprintf(_out,"0x%04x: %-*s  %s%s",
			//	oset, HEXDUMP_HEXSTUFF_PER_LINE,
			//	hexstuff, asciistuff, ident);
			sprintf(_lbl,"%04x%s",oset,ident);
			sprintf(_hex,"%-*s%s",HEXDUMP_HEXSTUFF_PER_LINE,hexstuff,ident);
			sprintf(_asc,"%s%s",asciistuff,ident);

			i = 0; hsp = hexstuff; asp = asciistuff;
			oset += HEXDUMP_BYTES_PER_LINE;
		}
		int sn=0;
		sn = MAXCAPMESSAGE - strlen(lbl);
		sn = sn >= 0 ? sn : 0;
		strcat(lbl,_lbl);
		strcpy(_lbl,"\0");

		sn = MAXCAPMESSAGE - strlen(hex);
		sn = sn >= 0 ? sn : 0;
		strcat(hex,_hex);
		strcpy(_hex,"\0");

		sn = MAXCAPMESSAGE - strlen(asc);
		sn = sn >= 0 ? sn : 0;
		strcat(asc,_asc);
		strcpy(_asc,"\0");


	}
	if (length & 1) {
		s1 = *cp++;
		(void)sprintf(hsp,
		    " %02x", s1);
		hsp += 3;
		*(asp++) = (isgraph(s1) ? s1 : '.');
		++i;
	}
	if (i > 0) {
		*hsp = *asp = '\0';
		//(void)sprintf(_out,"0x%04x: %-*s  %s%s",
		//      oset, HEXDUMP_HEXSTUFF_PER_LINE,
		//     hexstuff, asciistuff,ident);
		sprintf(_lbl,"%04x%s",oset,ident);
		sprintf(_hex,"%-*s%s",HEXDUMP_HEXSTUFF_PER_LINE,hexstuff,ident);
		sprintf(_asc,"%s%s",asciistuff,ident);
		int sn=0;
		sn = MAXCAPMESSAGE - strlen(lbl);
		sn = sn >= 0 ? sn : 0;
		strcat(lbl,_lbl);


		sn = MAXCAPMESSAGE - strlen(hex);
		sn = sn >= 0 ? sn : 0;
		strcat(hex,_hex);


		sn = MAXCAPMESSAGE - strlen(asc);
		sn = sn >= 0 ? sn : 0;
		strcat(asc,_asc);

	}

}
void
hex_and_ascii_print(register const char *ident, register const u_char *cp,
	register u_int length,char *lbl,char* hex,char* asc)
{
	hex_and_ascii_print_with_offset(ident, cp, length, 0,lbl,hex,asc);
}

/*
 * telnet_print() wants this.  It is essentially default_print_unaligned()
 */
void
hex_print_with_offset(register const char *ident, register const u_char *cp, register u_int length,
		      register u_int oset)
{
	register u_int i, s;
	register int nshorts;

	nshorts = (u_int) length / sizeof(u_short);
	i = 0;
	while (--nshorts >= 0) {
		if ((i++ % 8) == 0) {
			(void)printf("%s0x%04x: ", ident, oset);
			oset += HEXDUMP_BYTES_PER_LINE;
		}
		s = *cp++;
		(void)printf(" %02x%02x", s, *cp++);
	}
	if (length & 1) {
		if ((i % 8) == 0)
			(void)printf("%s0x%04x: ", ident, oset);
		(void)printf(" %02x", *cp);
	}
}

/*
 * just for completeness
 */
void
hex_print(register const char *ident, register const u_char *cp, register u_int length)
{
	hex_print_with_offset(ident, cp, length, 0);
}
